<?php
/*------------------------------------------------------------
  ZeroMail ADMIN core
  
  @version   1.0.4
  @copyright Copyright (c) Tenderfeel
  @link      http://zeromail.webtecnote.com/
  @license   GPL v3 License
  @since ZeroMail version 1.4
  
  [2010/12/08] 1.0.4 エラーメッセージの表示
  [2010/09/22] 1.0.3 id使用可能な文字列追加
  					 300kb超過警告
					 Downloadロジック変更
					 マルチ管理
　[2010/06/24] 1.0 一応完成
--------------------------------------------------------------*/

session_start();

//ini_set("display_errors", "On");error_reporting(E_ALL);
define("THISDIR", dirname( $_SERVER["SCRIPT_FILENAME"] )."/");
preg_match("/(.+)\/([^\/]+\/)$/i",THISDIR, $directory_match);
define( "ZEROMAIL_ADMDIR", str_replace($directory_match[2],'', THISDIR));
define("DOWANLOAD_RATE", 10);

if( (isset($_POST['id']) && $_POST['id']!=="") || (isset($_GET['id']) && $_GET['id']!=="0")){
	
	$_conf['id'] = ($_POST['id']!==""&&empty($_GET['id']))?$_POST['id']:$_GET['id'];
	
	if(!preg_match("/^[\d\w\-_]+$/i",$_conf['id'])) die("設定ファイルのIDが不正です。");
	
	if(!is_readable(ZEROMAIL_ADMDIR.'init'.$_conf['id'].'.php')) die("設定ファイルが読み込めません。");
	
	require(ZEROMAIL_ADMDIR.'init'.$_conf['id'].'.php');
	
}else{
	$_conf['id'] = 0;
	if(!is_readable(ZEROMAIL_ADMDIR.'init.php')) die("設定ファイルが読み込めません。");
	require(ZEROMAIL_ADMDIR.'init.php');
}

if(!defined('ZM_ADMIN') || ZM_ADMIN === false) die('管理機能が有効になっていません。');

if(ZM_ROOTOUT === true){
	define("ZM_LOGFILE",LOGFILEPASS);
}else{
	define("ZM_LOGFILE",THISDIR.LOGFILEPASS);
}

if(isset($_SESSION["_ZMADM"]) && $_SESSION["_ZMADM"] != "" && zeromail_shapass() === $_SESSION["_ZMADM"]){
	
	switch($_GET["view"]){
	
		case 'temp':
			$page_title = "ファイルディレクトリ";
			$table = zeromail_directory_view();
		break;
		
		case 'down':
			$page_title = "ダウンロード";
			$table = zeromail_download_view();
		break;
		
		default:
			$page_title = "ログ一覧";
			$table = zeromail_create_table();
	}
	
	$navi = '';
	
	if(is_array($zadmuse_fid) && count($zadmuse_fid) > 0){
		$navi .= '<form action="" method="get" class="idSelect"><select name="id">';
		foreach($zadmuse_fid as $zadmfid => $zadmfn){
			$navi .= '<option value="'.$zadmfid.'">'.$zadmfn.'</option>';
		}
		$navi .= '</select><button type="submit" name="view" value="list">変更</button></form>';
	}
	
	$navi .= '<ul class="navi"><li><a href="index.php?id='.$_conf['id'].'&view=list">ログを一覧で表示</a></li><li><a href="index.php?id='.$_conf['id'].'&view=temp">ファイルディレクトリの参照</a></li><li><a href="index.php?id='.$_conf['id'].'&view=down">ダウンロード</a></li></ul>';
	
	$logout = '<form action="" method="post" class="logout"><button name="mode" type="submit" value="logout" id="logout">Logout</button></form>';
	
	$bodyclass ='class="logon"';

}else{
	$bodyclass ='class="logoff"';
	$logout = '';
	$navi = '';
	$page_title = 'ログイン';
	$table = '<form action="index.php" method="post" class="login">
	<dl><dt><label for="formid">Form ID:</label></dt><dd><input type="text" name="id" id="formid" size="5" /></dd>
	<dt><label for="password">Password:</label></dt><dd><input name="password" id="password" type="password" /></dd></dl><p class="button"><button name="mode" type="submit" value="login" id="submit">Login</button></p></form>';
}

if(isset($_POST["mode"])){
	
	switch($_POST["mode"]){
		
		case "delete"://選択したファイル削除
			if(isset($_POST["delTempFile"])){
				zeromail_delete_file($_POST["delTempFile"]);
				header("Location:index.php?id=".$_conf['id']."&view=".urlencode($_GET["view"])."&message=deleted");
			}else{
				$_GET["message"] = "nocheck";
			}
		break;
		case "deleteall"://ログ全削除
			if(zeromail_clear_logfile()){
				header("Location:index.php?id=".$_conf['id']."&view=".urlencode($_GET["view"])."&message=deleted");
			}else{
				$_GET["message"] = "error";
			}
		break;
		
		case 'creaning'://ディレクトリ内ファイル全削除
			if(zeromail_creaning_directory()){
				header("Location:index.php?id=".$_conf['id']."&view=".urlencode($_GET["view"])."&message=deleted");
			}else{
				$_GET["message"] = "error";
			}
		break;
		
		case "dl_csv"://CSVダウンロード
			$_GET["message"] = zeromail_download_model(1, $_POST["option"]);
		break;
		
		case "dl_dir"://ディレクトリ内ファイルダウンロード
			$_GET["message"] = zeromail_download_model(2, $_POST["option"]);
		break;
		
		case 'login'://ログイン
			if(ZM_ADMINPASS === $_POST["password"]){//パスワード確認
				$_SESSION["_ZMADM"] = zeromail_shapass();//暗号化してセッションに保存
				
				header("Location:index.php?id=".$_conf['id']."&view=list");
				
			}else{
				$_GET["message"] = 'passmiss';
			}
		break;
		
		case 'logout'://ログアウト
			session_unset();
			session_destroy();
			$_SESSION = array();
			$id =!empty($_conf['id'])? 'id='.$_conf['id'].'&':'init.php';
			header("Location:index.php?".$id."message=logout");
		break;
	
	}
}


if(isset($_GET["message"])){
	switch($_GET["message"]){
		case "nocheck":
			$message = "ファイルが選択されていません";
		break;
		
		case "deleted":
			$message = "削除しました";
		break;
		
		case 'nologfile':
			$message = "ログファイルが見つかりません";
		break;
		
		case 'passmiss':
			$message = "パスワードが間違っています";
		break;
		
		case 'logout':
			$message = 'ログアウトしました';
		break;
		
		case 'error':
			$message = "エラーが発生しました";
		break;
		
		case 'nozip':
			$message = "圧縮ファイルの作成に失敗しました";
		break;
		
	}
	
	$_GET["message"] = "";
	
}else{
			$message = '';
}

include("template.php");

/*----------------------------------------------------
  ダウンロードモデル
----------------------------------------------------*/
function zeromail_download_model($case, $opt)
{
	global $inputs,$directory_match;
	
	switch($case){
		case 1://csv
			if(file_exists(ZM_LOGFILE)){
				
				$head = '"送信日時","'.implode('","',array_values($inputs))."\",\"IP\",\"Host\",\"User Agent\"\n";//csvのヘッダ
				
				if($opt == "allclear"){
					zeromail_clear_logfile();
				}
				header('Pragma: no-cache'); 
				header("Content-Type: application/octet-stream");
				header("Content-Disposition: attachment; filename=zeromail_log.csv");
				header("Content-Length: ".(filesize(ZM_LOGFILE)+strlen($head)-145));
				header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

				print(mb_convert_encoding($head, "SJIS", TEXTCODE));
				
				$fp = fopen(ZM_LOGFILE, "r");
				while(!feof($fp))
				{
					
					set_time_limit(0);//reset time limit for big files
					$line = fread($fp, round(DOWANLOAD_RATE * 1024));
					
					$line = preg_replace('/(<\?php exit;\/\*\n*)|(\n*\*\/\?>\n*)/',"", $line);
					print(mb_convert_encoding($line, "SJIS", TEXTCODE));
					
					flush();
        			@ob_flush();
				}
				fclose($fp);
				
				exit;
				
			}else{
				return 'nologfile';
			}
		break;
		
		case 2://dir
		
			$file_name = "zeromail_files.tar.gz";
			
			$tmp_file = tempnam("/tmp", "zmupdir");
			
			$command  = "tar czf $tmp_file -C ".$directory_match[1]." ".UPLOADPASS;
			system($command);
			
			$fsize = filesize($tmp_file);
			
			if($fsize==0) return "nozip";
			
			//圧縮ファイルの内容取得
			$fp = fopen($tmp_file, "r");
			$contents = fread($fp, $fsize);
			fclose($fp);
			
			unlink($tmp_file);
			
			if($opt == "allclear"){
				zeromail_creaning_directory();
			}
			
			header("Content-type: application/x-tar");
			header("Content-Disposition: attachment; filename=\"$file_name\"");
			header("Content-Length: ".strlen($contents));
			header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

			echo $contents;
			
			exit;
			
		break;
	}
}

/*----------------------------------------------------
  ダウンロードトップ
----------------------------------------------------*/
function zeromail_download_view()
{
	$mtime = filemtime(ZM_LOGFILE);
	$data = zeromail_load_file(ZM_LOGFILE);
	$dcount = count($data);
	
	$files = zeromail_scandir(ZEROMAIL_ADMDIR.UPLOADPASS);
	$fcount = count($files);
	
	$table = "<form method=\"post\" action=\"\" class=\"download zeromail\">\n";
	$table .= "<div id=\"downloads\">\n";
	$table .= "<table>\n";
	$table .= '<thead><th scope="col">対象</th><td scope="col">概要</td><td scope="col">ダウンロード</td></tr></thead>';
	$table .= "\n<tbody>\n";
	
	$table .= '<tr><th scope="row">'.basename(LOGFILEPASS)."</th>\n";
	$table .= '<td class="detail"><dl><dt class="mtime">最終更新日時</dt><dd class="mtime">'.date("Y/m/d - h:i:s",$mtime)."</dd>\n";
	$table .= '<dt class="count">ログ件数</dt><dd class="count">'.$dcount."</dd></dl></td>";
	$table .= '<td class="action">';
	
		if($dcount>0){
			$table .= '<button type="submit" name="mode" value="dl_csv">OK</button>';
			$table .= '<p class="option"><label><input type="checkbox" name="option" value="allclear" />ログを全て削除</label></p>';
		}else{
			$table .= '-';
		}
		
		$table .= '</td></tr>';
	
	$table .= '<tr><th scope="row">'.UPLOADPASS.'</th><td class=\"detail\"><dl><dt class="count">ファイル数</dt><dd class="count">'.$fcount."</dt></dl></td><td class=\"action\">\n";
		if($fcount>0){
			$table .= '<button type="submit" name="mode" value="dl_dir">OK</button>';
			$table .= '<p class="option"><label><input type="checkbox" name="option" value="allclear" />ファイルを全て削除</label></p>';
		}else{
			$table .= '-';
		}
	$table .= '</td></tr>';
	
	$table .= "\n</tbody>\n</table>\n</div>";
	$table .= "</form>";
	
	return $table;
}

/*----------------------------------------------------
  ディレクトリ参照
----------------------------------------------------*/
function zeromail_directory_view()
{
	global $inputs;
	
	$target = (strpos(IMG_CHECK_TARGET,"_")===0) ? ' target="'.IMG_CHECK_TARGET.'"':' rel="'.IMG_CHECK_TARGET.'"';
	
	$files = zeromail_scandir(ZEROMAIL_ADMDIR.UPLOADPASS);

		
	$table = "<form method=\"post\" action=\"\" class=\"directory zeromail\">\n";
	$table .= "<div id=\"logbody\">\n";
	$table .= "<table>\n";
	$table .= '<thead><th scope="col">送信日時</th><td scope="col">ファイル名</td></tr></thead>';
	$table .= "\n<tbody>\n";
		
	if(count($files)>0){
		
		foreach($files as $obj){
			
			list($width, $height, $type, $attr) = getimagesize(ZEROMAIL_ADMDIR.UPLOADPASS.$obj);
			$table .= "<tr>\n";
			$table .= "<th scope=\"row\">".date("Y/m/d - H:i:s", filemtime(ZEROMAIL_ADMDIR.UPLOADPASS.$obj))."</th>\n";
			$table .= "<td>\n";
			preg_match("/.\w{2,3}$/",$obj,$ext);
			$table .= '<input type="checkbox" name="delTempFile[]" value="'.$obj.'" />';
			$table .= '<a href="../'.UPLOADPASS.$obj.'"'.$target.'>';
			$table .= $obj.'</a>';
			$table .= "</td></tr>\n";
			
		}
		
	}else{
		$table .= "<tr><td colspan=\"2\" class=\"nodata\">ファイルがありません</td></tr>";
	}
		
	$table .= "\n</tbody>\n</table>\n</div>";
		
	if(count($files)>0) $table .= "<p class=\"button\"><button type=\"submit\" id=\"submit\" name=\"mode\" value=\"delete\">チェックしたファイルを削除</button><button type=\"submit\" id=\"submit\" name=\"mode\" value=\"creaning\">ファイルを全て削除</button></p>\n";
	$table .= "</form>";
	
	return $table;
}




/*----------------------------------------------------
  ログ参照
----------------------------------------------------*/
function zeromail_create_table()
{
	
	global $inputs;

	$row = 1;
	$table = '';
	
	if(file_exists(ZM_LOGFILE)){
		
		$filesize = filesize(ZM_LOGFILE);
		
		$data = zeromail_load_file(ZM_LOGFILE);
		$count = count($data);
		
		
		if($filesize > 3000 ) $table .= '<p class="caution message">ファイルサイズが300kbを超えています。（現在'.floor($filesize/1000).'kb）<br />ダウンロードを行ってください。</p>';
		$table .= "<form method=\"post\" action=\"\" class=\"loglist zeromail\">\n";
		
		$table .= "<div id=\"logbody\">\n<table>\n";
			
			$headers = '<tr><th scope="col">#</th><td scope="col">送信日時</td><td scope="col">'.implode('</td><td scope="col">',array_values($inputs))."</td><td>IP</td><td>Host</td><td>User Agent</td></tr>";
		
		$table .= "<thead>".$headers."</thead>\n";
		if($count>5) $table .= "<tfoot>".$headers."</tfoot>\n";
		
		$table .= "<tbody>\n";
		
		if($count>0){
		
			foreach($data as $row => $line){
				$table .= "<tr>\n";
				$table .= '<th scope="row">'.($row+1)."</th>\n";
				$line = convert_encode($line);
				$cell = explode(",",str_replace('"',"",$line));
				$num = count($cell);
				
				for ($c=0; $c < $num; $c++) {
					$table .= '<td>';
					
					if(FILETEMP===true && FILEPOOL===true 
					   && preg_match("/([\w\d]+.\w{2,3})\s*\([\d\.]+kb\)\s*/",$cell[$c],$ma)){
						
						$target = (strpos(IMG_CHECK_TARGET,"_")===0) ? ' target="'.IMG_CHECK_TARGET.'"':' rel="'.IMG_CHECK_TARGET.'"';
						
						if(file_exists(ZEROMAIL_ADMDIR.UPLOADPASS.$ma[1])){
							$table .= '<input type="checkbox" name="delTempFile[]" value="'.$ma[1].'" />';
							$table .= '<a href="../'.UPLOADPASS.$ma[1].'"'.$target.'>'.$cell[$c].'</a>';
						}else{
							$table .= $cell[$c];
						}
						
					}elseif(preg_match("/^(?:http|https|ftp):\/\//",$cell[$c])){
						
						$table .= '<a href="'.$cell[$c].'">'.$cell[$c].'</a>';
					
					}else{
						$table .= ($cell[$c]=="")? "&nbsp;":$cell[$c];
					}
					$table .= "</td>\n";
				}
				
				$table .= "</tr>\n";
			}
		}else{
			$table .= "<tr>\n";
			$table .= '<td colspan="'.(count($inputs)+5).'" class="nodata">';
			$table .= "データがありません</td>\n";
			$table .= "</tr>\n";
		}
		
		$table .= "</tbody>\n</table></div>\n";
		
		if(isset($ma) || $count>0){
			$table .= "<p class=\"button\">\n";
		
		
			if(isset($ma)){ 
				$table .= "<button type=\"submit\" id=\"submit\" name=\"mode\" value=\"delete\">チェックしたファイルを削除</button>";
			}
			if($count>0){
				$table .= "<button type=\"submit\" id=\"submit\" name=\"mode\" value=\"deleteall\">ログを全て削除</button>";
			}
		
			$table .= "</p>\n";
		}
		
		$table .= "</form>";

	}else{
		$_GET['message'] = 'nologfile';
	}
	
	return $table;
	
}


/* アップロードディレクトリ内全ファイル削除
--------------------------------------------------*/
function zeromail_creaning_directory()
{
	$files = zeromail_scandir(ZEROMAIL_ADMDIR.UPLOADPASS);
	return zeromail_delete_file($files);
}

/* アップロードファイル削除
--------------------------------------------------*/
function zeromail_delete_file($files)
{
	if( !is_array($files) || (is_array($files) && count($files)==0) ) return 'nocheck';
	
	
	$data = file_get_contents(ZM_LOGFILE);
	
	foreach($files as $file){
		@unlink(ZEROMAIL_ADMDIR.UPLOADPASS.$file);
		$file = str_replace('.','\.',$file);
		$data = preg_replace("/".$file."\s*\([\d\.]+kb\)\s*/im","",$data);
	}
	
	$fp = fopen(ZM_LOGFILE, "w");
	fwrite($fp, mb_convert_encoding($data,"UTF-8", TEXTCODE));
	fclose($fp);
	
	return true;
}

/* アップロードディレクトリ参照
--------------------------------------------------*/
function zeromail_scandir($dir)
{
	$dh  = opendir($dir);
	$files = array();
	
	while (false !== ($filename = readdir($dh))) {
		if(preg_match('/^(.|..|_)\w*$/',$filename)===1) continue;
		$files[] = $filename;
	}
	
	if(is_array($files)) sort($files);
	
	return $files;
}


/* ログ読み込み
--------------------------------------------------*/
function zeromail_load_file($filename)
{
	$data = file($filename);
	array_shift($data);
	array_pop($data);
	
	return $data;
}

/* ログファイルクリア
--------------------------------------------------*/
function zeromail_clear_logfile()
{
	
	if(unlink(ZM_LOGFILE))
		return touch(ZM_LOGFILE);
	else
		return false;
}

/* パスワード
--------------------------------------------------*/
function zeromail_shapass()
{
	return substr(sha1(ZM_ADMINPASS),2,10);
}

?>